package nl.minicom.gitolite.manager.git;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PublicKey;
import java.security.interfaces.RSAPublicKey;
import java.util.Base64;
public class KeyGenerator {
public static void main(String... args) throws NoSuchAlgorithmException, IOException {
KeyPair keyPair = generateKeyPair();
System.out.println(encodePublicKey(keyPair.getPublic()));
}
public static KeyPair generateKeyPair() throws NoSuchAlgorithmException {
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
generator.initialize(2048);
return generator.generateKeyPair();
}
/**
* Encode PublicKey (DSA or RSA encoded) to authorized_keys like string
*
* @param publicKey
* DSA or RSA encoded
* @return authorized_keys like string
* @throws IOException
* if an I/O error occurs.
*/
public static String encodePublicKey(final PublicKey publicKey)
throws IOException {
if (publicKey.getAlgorithm().equals("RSA")) {
RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey;
ByteArrayOutputStream byteOs = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(byteOs);
dos.writeInt("ssh-rsa".getBytes().length);
dos.write("ssh-rsa".getBytes());
dos.writeInt(rsaPublicKey.getPublicExponent().toByteArray().length);
dos.write(rsaPublicKey.getPublicExponent().toByteArray());
dos.writeInt(rsaPublicKey.getModulus().toByteArray().length);
dos.write(rsaPublicKey.getModulus().toByteArray());
return "ssh-rsa " + new String(Base64.getEncoder().encode(byteOs
.toByteArray()));
} else {
throw new IllegalArgumentException("Unknown public key encoding: "
+ publicKey.getAlgorithm());
}
}
public static String generateRandomPublicKey() throws NoSuchAlgorithmException, IOException {
return encodePublicKey(generateKeyPair().getPublic());
}
}